package com.sky.mapper;

import com.sky.dto.MerchantPageQueryDTO;
import com.sky.dto.MerchantUpdateDTO;
import com.sky.entity.Merchant;
import com.sky.entity.MerchantCategory;
import com.sky.vo.MerchantVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
import java.util.Map;

@Mapper
public interface MerchantMapper {
    /**
     * 分页查询商家列表
     * @param merchantPageQueryDTO 分页查询条件
     * @return 商家列表
     */
    List<Merchant> selectByPage(MerchantPageQueryDTO merchantPageQueryDTO);

    /**
     * 查询商家总数
     * @param merchantPageQueryDTO 查询条件
     * @return 商家总数
     */
    Integer selectCount(MerchantPageQueryDTO merchantPageQueryDTO);

    /**
     * 根据ID查询商家
     * @param id 商家ID
     * @return 商家对象
     */
    Merchant selectById(Long id);

    /**
     * 根据用户名查询商家
     * @param username 用户名
     * @return 商家对象
     */
    Merchant selectByUsername(String username);

    /**
     * 新增商家
     * @param merchant 商家对象
     */
    void insert(Merchant merchant);

    /**
     * 更新商家信息
     * @param merchant 商家对象
     */
    void update(Merchant merchant);

    /**
     * 更新商家状态
     * @param merchantUpdateDTO 商家更新DTO
     */
    void updateStatus(MerchantUpdateDTO merchantUpdateDTO);
    
    /**
     * 查询商家列表并关联分类信息
     * @param merchantPageQueryDTO 查询条件
     * @return 商家VO列表
     */
    List<MerchantVO> selectMerchantWithCategory(MerchantPageQueryDTO merchantPageQueryDTO);

    /**
     * 删除商家
     * @param id 商家ID
     */
    void deleteById(Long id);

    /**
     * 查询商家订单列表
     * @param params 查询条件
     * @return 订单列表
     */
    List<Map<String, Object>> selectMerchantOrders(Map<String, Object> params);

    /**
     * 查询商家订单总数
     * @param params 查询条件
     * @return 订单总数
     */
    Integer selectMerchantOrdersCount(Map<String, Object> params);

    /**
     * 查询商家总营收
     * @param merchantId 商家ID
     * @return 总营收
     */
    Double selectTotalRevenueByMerchantId(Long merchantId);
    
    /**
     * 更新商家营业状态
     * @param id 商家ID
     * @param businessStatus 营业状态
     */
    void updateBusinessStatus(@Param("id") Long id, @Param("businessStatus") String businessStatus);

    /**
     * 根据日期范围查询商家数量
     * @param params 包含startDate和endDate的参数Map
     * @return 商家数量
     */
    Long selectCountByDateRange(Map<String, Object> params);
    
    /**
     * 查询所有商家分类
     * @return 商家分类列表
     */
    List<MerchantCategory> selectAllCategories();
    
    /**
     * 查询商家账户信息
     * @param merchantId
     * @return
     */
    Map<String, Object> selectMerchantAccount(Long merchantId);
    
    /**
     * 查询商家营业额统计
     * @param params 查询参数
     * @return 营业额统计列表
     */
    List<Map<String, Object>> selectRevenueStatistics(Map<String, Object> params);
}